package cn.com.guage.single.idler;

/**
 * 懒汉式-方式3（双重检查锁）
 * 再来讨论一下懒汉模式中加锁的问题，对于 getInstance()
 * 方法来说，绝大部分的操作都是读操作，读操作是线程安全的，所以我们没必要让每个线程必须持有锁才能调用该方法，
 * 我们需要调整加锁的时机。由此也产生了一种新的实现模式：双重检查锁模式；
 * 
 * @author yangdechao
 *
 */
public class Singleton3 {

	private static Singleton3 instance;

	public Singleton3() {
	}

	public static Singleton3 getInstance() {
		if (instance == null) {
			synchronized (Singleton3.class) {
				if (instance == null) {
					instance = new Singleton3();
				}

			}

		}
		return instance;
	}

	public void say() {
		System.out.println("say");
	}

	public static void main(String[] args) {
		Singleton3 instance1 = Singleton3.getInstance();
		System.out.println(instance1);
		instance1.say();
		Singleton3 instance2 = Singleton3.getInstance();
		System.out.println(instance2);
	}

}
